// #include <stdio.h>
// #include <stdlib.h>
// #include <assert.h>
//
// #include "Address Book(SeqList)/SeqList.h"
//
// typedef struct DNode {
//     int data;
//     int freq;            // 访问频度
//     struct DNode *prev;  // 前驱指针
//     struct DNode *next;  // 后继指针
// } DNode;
//
// typedef struct {
//     DNode *head;        // 带头结点
//     int length;
// } FreqLinkedList;
//
// // 初始化链表
// void initList(FreqLinkedList *L) {
//     L->head = (DNode*)malloc(sizeof(DNode));
//     L->head->prev = NULL;
//     L->head->next = NULL;
//     L->length = 0;
// }
//
// // 插入节点（尾插法）
// void insert(FreqLinkedList *L, int data) {
//     DNode *newNode = (DNode*)malloc(sizeof(DNode));
//     newNode->data = data;
//     newNode->freq = 0;
//     newNode->next = NULL;
//
//     DNode *p = L->head;
//     while (p->next != NULL) {
//         p = p->next;
//     }
//
//     p->next = newNode;
//     newNode->prev = p;
//     L->length++;
// }
//
// // 打印链表
// void printList(FreqLinkedList *L) {
//     DNode *p = L->head->next;
//     printf("当前链表: ");
//     while (p != NULL) {
//         printf("[%d(freq=%d)] ", p->data, p->freq);
//         p = p->next;
//     }
//     printf("\n");
// }
//
// // 核心Locate函数
// DNode* Locate(FreqLinkedList *L, int x) {
//     if (L->head->next == NULL) {
//         printf("空链表！\n");
//         return NULL;
//     }
//
//     DNode *p = L->head->next;
//     DNode *target = NULL;
//
//     // 1. 查找目标节点
//     while (p != NULL) {
//         if (p->data == x) {
//             target = p;
//             break;
//         }
//         p = p->next;
//     }
//
//     if (target == NULL) {
//         printf("未找到%d节点\n", x);
//         return NULL;
//     }
//
//     // 2. 频度更新与位置调整
//     target->freq++;
//     printf("节点%d频度+1 => freq=%d\n", x, target->freq);
//
//     // 从原位置移除
//     if (target->prev != L->head) {  // 不是第一个节点
//         target->prev->next = target->next;
//     }
//     if (target->next != NULL) {
//         target->next->prev = target->prev;
//     }
//
//     // 寻找新位置
//     DNode *q = L->head->next;
//     while (q != NULL && q != target && q->freq > target->freq) {
//         q = q->next;
//     }
//
//     // 插入到q前（或尾部）
//     if (q != NULL && q != target) {
//         target->prev = q->prev;
//         target->next = q;
//         q->prev->next = target;
//         q->prev = target;
//     } else if (q == NULL) {  // 插入尾部
//         DNode *tail = L->head;
//         while (tail->next != NULL) tail = tail->next;
//         tail->next = target;
//         target->prev = tail;
//         target->next = NULL;
//     }
//     // q == target时说明位置不变
//
//     return target;
// }
//
// // 释放链表内存
// void destroyList(FreqLinkedList *L) {
//     DNode *p = L->head;
//     while (p != NULL) {
//         DNode *temp = p;
//         p = p->next;
//         free(temp);
//     }
// }
//
// int main() {
//     SetConsoleOutputCP(CP_UTF8);
//     FreqLinkedList L;
//     initList(&L);
//
//     // 初始化测试数据
//     insert(&L, 10);
//     insert(&L, 20);
//     insert(&L, 30);
//     insert(&L, 40);
//     insert(&L, 50);
//
//     printf("----- 初始链表 -----\n");
//     printList(&L);
//
//     printf("\n----- 测试Locate(30) -----\n");
//     Locate(&L, 30);
//     printList(&L);
//
//     printf("\n----- 测试Locate(20) -----\n");
//     Locate(&L, 20);
//     printList(&L);
//
//     printf("\n----- 测试Locate(30) -----\n");
//     Locate(&L, 30);
//     printList(&L);
//
//     printf("\n----- 测试Locate(50) -----\n");
//     Locate(&L, 50);
//     printList(&L);
//
//     printf("\n----- 测试Locate(20) -----\n");
//     Locate(&L, 20);
//     printList(&L);
//
//     printf("\n----- 测试Locate(10) -----\n");
//     Locate(&L, 10);
//     printList(&L);
//
//     printf("\n----- 测试Locate(30) -----\n");
//     Locate(&L, 30);
//     printList(&L);
//
//     destroyList(&L);
//     return 0;
// }